package com.sinopec.pi.scalaguide.errorhandle


object OptionUsage {
    // 输入非法时，需要明确区分
    private def makeInt(s: String): Option[Int] = {
        try {
            Some(Integer.parseInt(s.trim))
        } catch {
            case e: Exception => None
        }
    }

    // 输入非法时，使用默认值的情况
    private def makeInt(s:String, default : Int) : Int = {
        try {
            Integer.parseInt(s.trim)
        } catch {
            case e: Exception => default
        }
    }

    def main(args: Array[String]): Unit = {
        // 参数非法时，需要进行其它处理时
        makeInt("invalid") match {
            case Some(i) => println(i)
            case None => println("That didn’t work.")
        }

        // 当所有输入都合法时，才进行计算
        val stringA = "not int"
        val stringB = "2"
        val stringC = "3"

        val y = for {
            a <- makeInt(stringA)
            b <- makeInt(stringB)
            c <- makeInt(stringC)
        } yield {
            a + b + c
        }
        println(y)

        // 如果输入不合法时，使用默认值，使用 Option 反而不是很直观
        val opts = List(makeInt(stringA), makeInt(stringB), makeInt(stringC))
        val sumOption = opts.foldLeft(0)((acc, opt) => acc + opt.getOrElse(0))

        println(sumOption)

        println(makeInt(stringA, 0) + makeInt(stringB, 0) + makeInt(stringC, 0))

    }
}
